package com.gjb6.customer.utils.permssion;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.Fragment;

/**
 * <p>
 * 所有的权限必须尝试请求。并且在（Activity/Fragment/OnRequestPermissionsResultListener）onRequestPermissionsResult 进行判断 原因如下：
 * OnRequestPermissionsResultListener
 * 1、权限第一次请求之前 是denied 状态，并且 shouldShowRequestPermissionRationale false 而这点是判断权限是否被永久拒绝的依据
 * 2、第一次被拒绝，按照安卓原生，第二次会再次弹出对话框。除非勾选不再提示，否则每次点击的时候都会弹出对话框。（小米是第一次被拒绝，以后
 * 被永久拒绝） ，我们需要兼容这两种情况。
 * </p>
 * 使用下面的方法，请不要对权限判断，直接使用，只关注当前你需要那些权限，结果如何。
 * 如果使用{@link PermissionRequest#call(int)} ，指定对象（Activity/Fragment ）的onRequestPermissionsResult回调务必判断requestCode，
 * 防止Activity与Fragment之间相互影响
 */

public class Guardian {
    static boolean isChecked = false;
    static int FRAGMENT_REQUEST_CODE = 7942;
    static final String PERMISSION_FRAGMENT_NAME = "com.luyinbros.permission.PermissionFragment";

    private Guardian() {
    }

    /**
     * fragment 开始请求权限
     *
     * @param fragment 请求使用者
     * @return 请求体
     * @since 1.0
     */
    public static PermissionRequest with(Fragment fragment) {
        return new PermissionRequestImpl(fragment);
    }

    /**
     * Activity 开始请求权限
     * 如果activity 非FragmentActivity 使用{@link PermissionRequest#call(OnRequestPermissionsResultListener)}且
     * 当前SDK版本小于23 会抛出{@link IllegalStateException}
     *
     * @param activity 请求使用者
     * @return 请求体
     * @since 1.0
     */
    public static PermissionRequest with(Activity activity) {
        return new PermissionRequestImpl(activity);
    }

    /**
     * 根据fragment 开始请求权限
     *
     * @param fragment 请求使用者
     * @return 请求体
     * @since 1.0
     */
    @TargetApi(Build.VERSION_CODES.M)
    public static PermissionRequest with(android.app.Fragment fragment) {
        return new PermissionRequestImpl(fragment);
    }

    /**
     * 开启检查，每次调用请求时，会去检查你的Permission是否在AndroidManifest
     *
     * @since 1.0
     */
    public static void openCheck() {
        Guardian.isChecked = true;
    }

    /**
     * 检查权限列表是否在AndroidManifest
     * 如果不存在，则会抛出{@link IllegalStateException}
     *
     * @param context     当前上下文
     * @param permissions 请求列表
     * @since 1.0
     */

    public static void checkPermissionInManifest(Context context, String... permissions) {
        PackageManager packageManager = context.getPackageManager();
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
            String[] usesPermissionsArray = packageInfo.requestedPermissions;
            if (permissions.length != 0 && (usesPermissionsArray == null || usesPermissionsArray.length == 0)) {
                throw new IllegalArgumentException("androidManifest don't have any permission");
            }

            for (int requestIndex = 0, length = permissions.length; requestIndex < length; requestIndex++) {
                boolean tag = false;
                String permission = permissions[requestIndex];
                for (int i = 0; i < usesPermissionsArray.length; i++) {
                    if (usesPermissionsArray[i].equals(permission)) {
                        tag = true;
                        break;
                    }
                }
                if (!tag) {
                    throw new IllegalArgumentException(String.format("Unable to find explicit permission name {%s}; have you declared this permission in your AndroidManifest.xml?", permission));
                }
            }

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }

    static void checkPermissionIfOpenCheck(Context context, String[] permissions) {
        if (isChecked) {
            checkPermissionInManifest(context, permissions);
        }
    }
}